﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

namespace Gqq.Csharpindepth.Chapter23
{
    /// <summary>
    /// 实现IEnumerable，表示是可以迭代的。
    /// 必须要实现IEnumerator GetEnumerator()方法。
    /// </summary>
    public class CountEnumerable : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()
        {
            //            return new CountEnumrator();
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public static IEnumerable<string> InputTest(int start)
        {
            //while (true)
            //{
            //    var t = Console.ReadLine();
            //    Debug.Assert(t != null, "t != null");
            //    if (t.Equals("exit", StringComparison.CurrentCultureIgnoreCase))
            //        break;
            //    yield return t;
            //}
            string[] strs = {"Hello", "Worlde", "EveryOne", "Test", "Just Do it"};
            for (int i = start; i < strs.Length; i++)
            {
                yield return strs[i];
            }

        }
    }

    /// <summary>
    /// 迭代器：一开始_current指向的是首元素的前面一个元素。
    /// 在foreach调用的时候，先调用MoveNext方法，再取得属性Current。
    /// </summary>
    internal class CountEnumrator : IEnumerator<int>
    {
        private int _current = -1;
        public void Dispose()
        {
        }

        public bool MoveNext()
        {
            if (_current++ < 10)
                return true;
            return false;
        }

        public void Reset()
        {
            _current = -1;
        }

        public int Current
        {
            get { return _current; }
        }

        object IEnumerator.Current
        {
            get { return Current; }
        }
    }
}
